
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Zookeeper如何实现分布式一致性？ - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>Zookeeper如何实现分布式一致性？ - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">ZooKeeper 实现分布式一致性的核心协议是什么？该协议旨在解决什么核心问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">ZooKeeper 实现分布式一致性的核心协议是 ZAB（ZooKeeper Atomic Broadcast）协议。它专门解决了在不可靠的网络环境中，如何确保集群中数据的一致性和事务的全局有序性的问题。</div>
          </div>
          <div class="card-source">来源: Zookeeper如何实现分布式一致性？</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">ZAB 协议包含哪两种主要模式？它们分别在什么场景下被激活？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">ZAB 协议包含两种主要模式：领导选举（Leader Election）模式和广播（Atomic Broadcast）模式。当 ZooKeeper 集群启动或现有 Leader 节点失效时，会进入领导选举模式；一旦 Leader 被选举出来，集群就进入广播模式。</div>
          </div>
          <div class="card-source">来源: ZAB协议的概念 > 1. ZAB协议的概念</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">ZooKeeper 的数据结构是怎样的？其中每个节点被称为什么？它支持哪三种基本操作？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">ZooKeeper 采用简单的树形数据结构，类似于文件系统。其中每个节点称为“znode”。它支持的基本操作包括：节点创建和删除、节点数据读取和写入、以及监听机制（Watcher）。</div>
          </div>
          <div class="card-source">来源: ZooKeeper概述与分布式一致性需求 > 1. ZooKeeper的基本功能</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">请描述 ZAB 协议在消息广播模式下处理一个写请求的完整流程。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">1. 事务提案生成：Leader 为每个写请求生成唯一的事务ID（ZXID）并创建事务提案（Proposal）。 2. 提案广播：Leader 将提案广播给所有 Follower 节点。 3. 提案确认：Follower 接收提案后暂存并向 Leader 发送确认（ACK）。 4. 事务提交：当 Leader 收到超过半数节点的确认后，会向所有节点发送提交（Commit）消息，所有节点正式应用该事务。</div>
          </div>
          <div class="card-source">来源: ZAB协议的工作机制 > 2. 消息广播模式（Broadcast Mode）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在 ZAB 协议的领导选举算法中，节点投票的两个主要判断依据是什么？它们的优先级是怎样的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">节点投票的两个主要判断依据是事务ID（ZXID）和节点ID（myid）。优先级更高的是 ZXID，节点会优先选择 ZXID 较大的节点；只有在 ZXID 相同的情况下，才会比较 myid，选择 myid 较大的节点。</div>
          </div>
          <div class="card-source">来源: ZAB协议选举算法 > 2.1 选举过程</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">概念</div>
          <div class="card-question">什么是 ZXID？它在保证 ZooKeeper 数据一致性中扮演了什么关键角色？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">概念</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">ZXID（ZooKeeper Transaction ID）是一个全局递增的64位数字，是每一个事务的唯一标识。它通过为每个事务分配唯一的、顺序的ID，确保了所有事务的全局顺序，从而帮助 ZooKeeper 维护严格的事务顺序，保证系统的顺序一致性和线性一致性。</div>
          </div>
          <div class="card-source">来源: ZAB协议中的数据一致性保证 > 2.3 事务ID（ZXID）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">ZAB 协议的崩溃恢复模式包含哪两个主要阶段？它们各自的目标是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">崩溃恢复模式包含两个阶段：1. 领导选举（Leader Election），其目标是选举出一个新的 Leader 节点；2. 数据同步（Data Synchronization），其目标是确保所有 Follower 节点的状态与新 Leader 的数据状态同步一致，以便集群可以安全地进入消息广播模式。</div>
          </div>
          <div class="card-source">来源: ZAB协议的工作机制 > 1. 崩溃恢复模式（Crash Recovery Mode）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">ZAB 协议设计的主要目标体现在哪四个方面？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">ZAB协议设计的主要目标体现在以下四个方面：1. 数据一致性（Data Consistency），确保所有数据更新以相同顺序应用；2. 容错性（Fault Tolerance），在部分节点失效时仍能提供服务；3. 快速恢复（Fast Recovery），当 Leader 失效时能迅速选举新 Leader；4. 线性化（Linearizability），保证每个写操作看起来都是瞬时发生的。</div>
          </div>
          <div class="card-source">来源: ZAB协议的概念 > 2. ZAB协议的目标</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">ZAB 协议如何通过原子广播机制来保障数据一致性？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在原子广播机制下，所有写请求（事务）都会被 Leader 节点转变为提议（Proposal）并分发给所有 Follower。当 Leader 收到超过半数节点的确认后，才会提交该提议。这个过程保证了每个写操作都被所有节点以相同的顺序执行，从而确保了数据的一致性。</div>
          </div>
          <div class="card-source">来源: ZAB协议中的数据一致性保证 > 2.2 原子广播机制</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
